package proxy.example.dynamic;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * Cglib实现动态代理，需要额外引入jar包。通过继承构建子类，不需要实现接口
 * @author Chen Guang
 * @date 2019/4/8 0008 上午 9:56
 */
public class CglibProxyFactory {
    /**
     * 维护一个目标对象
     */
    private Object target;

    public CglibProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 给目标对象生成代理对象
     * @return 代理对象
     */
    public Object getProxyInstance(){
        //1.增强类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(target.getClass());
        //3.设置回调函数
        en.setCallback((InvocationHandler) (o, method, args) -> {
            //执行目标对象方法
            System.out.println("我代替XXX送你：");
            Object returnValue = method.invoke(target, args);
            System.out.println("希望你答应");
            return returnValue;
        });
        //4.创建子类(代理对象)
        return en.create();
    }
}
